#pragma once

#include <iostream>
#include <string>
#include <unordered_map>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

using namespace std;

class User
{
public:
    User(const string &ip, const uint16_t &port) : _ip(ip), _port(port)
    {
    }
    ~User()
    {
    }
    string ip(){ return _ip; }
    uint16_t port(){ return _port; }
private:
    string _ip;
    uint16_t _port;
};

class OnlineUser
{   public:
     OnlineUser(){}
     ~OnlineUser(){}
     void addUser(const string &ip,const uint16_t &port)
     {  
       string name=ip+"-"+to_string(port);
       users.insert(make_pair(name,User(ip,port)));
     }
     void delUser(const string &ip,const uint16_t &port)
     {
       string name=ip+"-"+to_string(port);
        users.erase(name);
     }
     bool isOnline(const string &ip,const uint16_t &port)
     {
        string name=ip+"-"+to_string(port);
        return users.find(name)!=users.end()?true:false;        
     }
     void broadcastMessage(int sockfd,const string &ip,const uint16_t &port,const string &message)
     {  
        for(auto &user:users)//把每个客户端的信息都返回给客户端
        {  struct sockaddr_in client;
            bzero(&client,sizeof(client));
            client.sin_family=AF_INET;
            client.sin_port=htons(user.second.port());//服务端获取客户端的信息
            client.sin_addr.s_addr=inet_addr(user.second.ip().c_str());
            string s=ip+"-"+to_string(port)+"#";//客户端的信息和发的内容发给每一个客户端
            s+=message;
            sendto(sockfd, s.c_str(), s.size(), 0, (struct sockaddr *)&client, sizeof(client));



        }

     }


 private:
  unordered_map<string,User> users;

};